package net.sisgac.cliente.model.dao.jpa;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


import net.sisgac.cliente.model.Cliente;
import net.sisgac.cliente.model.dao.ClienteDAO;



public class JPAClienteDAO implements ClienteDAO {
	
	private EntityManager em;
	private Log log = LogFactory.getLog(getClass());
	
	public JPAClienteDAO (EntityManager em){
		this.em=em;
	}
	
		
	public Cliente findById(String codigo){
		Query query=em.createQuery("Select o From Cliente o where o.idCliente=?1");
		query.setParameter(1, codigo);
		return (Cliente)query.getSingleResult();	
	}


	@Override
	public List<Cliente> findAll() {
		// TODO Auto-generated method stub
		Query query=em.createQuery("Select o From Cliente o");
		return query.getResultList();
	}


	@Override
	public Cliente find(Cliente o) {
		// TODO Auto-generated method stub
		StringBuilder sql=new StringBuilder();
		sql.append("Select o From Cliente o Where");
		List<String> criteria = new ArrayList<String>();
		if(o.getNombrecliente()!=null)criteria.add("o.nombreCliente=:nombreCliente");
		if(o.getIdcliente()!=null)criteria.add("o.idcliente=:idcliente");
		
		if(criteria.size()==0){
			throw new RuntimeException("No existen coincidencias para el criterio de busqueda ingresado");
		}
		for(int i=0;i<criteria.size();i++){
			if(i>0){ sql.append(" Or ");	}
			sql.append(criteria.get(i));
		}
		Query query=em.createQuery(sql.toString());
		if(o.getNombrecliente()!=null) query.setParameter("nombreCliente", o.getNombrecliente());
		if(o.getIdcliente()!=null) query.setParameter("idcliente", o.getIdcliente());
		Cliente cliente=null;
		try{
			cliente=(Cliente)query.getSingleResult();
		}catch(NoResultException ex){
			log.warn("No hay resultados de la consulta"+ex.getMessage());
		}
		return cliente; 
	}

}
